#!/bin/bash

# 获取脚本所在目录的绝对路径
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# 服务配置
APP_NAME="test_data_api"
APP_DIR="$SCRIPT_DIR"
PYTHON_APP="app.application:app"
PORT=8010
PID_FILE="$APP_DIR/.pid"

# 获取服务进程ID
get_pid() {
    if [ -f "$PID_FILE" ]; then
        pid=$(cat "$PID_FILE")
        # 检查进程是否真实存在
        if ps -p "$pid" > /dev/null 2>&1; then
            echo "$pid"
            return 0
        fi
    fi
    # 通过端口查找进程
    pid=$(lsof -ti ":$PORT" 2>/dev/null)
    echo "$pid"
    return 0
}

# 启动服务
start() {
    pid=$(get_pid)
    if [ ! -z "$pid" ]; then
        echo "[$APP_NAME] 服务已在运行中 (PID: $pid)"
        return 1
    fi
    
    echo "[$APP_NAME] 正在启动服务..."
    cd "$APP_DIR" || exit 1
    nohup uvicorn "$PYTHON_APP" --host 0.0.0.0 --port "$PORT" --reload > ./logs/app.log 2>&1 &
    new_pid=$!
    echo $new_pid > "$PID_FILE"
    sleep 2
    
    if ps -p $new_pid > /dev/null; then
        echo "[$APP_NAME] 服务启动成功 (PID: $new_pid)"
    else
        echo "[$APP_NAME] 服务启动失败"
        rm -f "$PID_FILE"
        return 1
    fi
}

# 停止服务
stop() {
    pid=$(get_pid)
    if [ -z "$pid" ]; then
        echo "[$APP_NAME] 服务未在运行"
        rm -f "$PID_FILE"
        return 0
    fi
    
    echo "[$APP_NAME] 正在停止服务 (PID: $pid)..."
    kill "$pid"
    
    # 等待进程结束
    for i in {1..10}; do
        if ! ps -p "$pid" > /dev/null 2>&1; then
            echo "[$APP_NAME] 服务已停止"
            rm -f "$PID_FILE"
            return 0
        fi
        sleep 1
    done
    
    # 如果进程仍然存在，强制终止
    echo "[$APP_NAME] 服务无响应，正在强制终止..."
    kill -9 "$pid" 2>/dev/null
    rm -f "$PID_FILE"
    echo "[$APP_NAME] 服务已强制终止"
}

# 重启服务
restart() {
    stop
    sleep 2
    start
}

# 检查服务状态
status() {
    pid=$(get_pid)
    if [ -z "$pid" ]; then
        echo "[$APP_NAME] 服务未在运行"
        return 1
    else
        echo "[$APP_NAME] 服务正在运行 (PID: $pid)"
        return 0
    fi
}

# 创建日志目录
mkdir -p "$APP_DIR/logs"

# 根据命令行参数执行相应操作
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        restart
        ;;
    status)
        status
        ;;
    *)
        echo "用法: $0 {start|stop|restart|status}"
        exit 1
        ;;
esac

exit 0
